home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Camelot
/
Camelot 134 (1991-10)(Swedish User Group of Amiga)(SE)(PD)[WB].zip
/
Camelot 134 (1991-10)(Swedish User Group of Amiga)(SE)(PD)[WB].adf
/
RxSlides
/
RxSlidesDs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-08
|
6KB
|
255 lines
/* :bk=0 */
/****************************************************************/
/* */
/* RxSlidesDs.c */
/* */
/* Author: Dean Bandes from Lee M. Robertson's "Dissolve" */
/****************************************************************/
#include "exec/types.h"
#include "exec/memory.h"
#include "graphics/gfx.h"
#include "intuition/intuition.h"
#include "storage.h"
#include <stdio.h>
#include "RxSlides.h"
#include "RxSliPic.h"
void *GetMsg();
void *AllocMem();
extern struct GfxBase *GfxBase;
extern struct IntuitionBase *IntuitionBase;
/*---------------------------------------------------------------------------
*
*-------------------------------------------------------------------------*/
get_message()
{
extern struct Window *Window;
register ULONG class;
register USHORT code;
register struct IntuiMessage *Message;
static int retval = 0;
while( Message = (struct IntuiMessage *) GetMsg(Window->UserPort) )
{
class = Message->Class;
code = Message->Code;
ReplyMsg(Message);
/* allow any key press to end program */
if( class == CLOSEWINDOW || class == RAWKEY )
retval = 1;
/* allow user to hold program with right mouse button */
else if( class == MOUSEBUTTONS && code == MENUDOWN )
WaitPort( Window->UserPort);
}
return retval;
}
/*---------------------------------------------------------------------------
* some global variables for the dissolve function
*-------------------------------------------------------------------------*/
unsigned long rand_mask; /* the mask value for the random # generator */
unsigned long rand_val; /* the current random # value */
unsigned long rand_tbl[] = /* the table of random mask values */
{ /* from Nov '86 DDJ p. 48 */
0,0, /* first 2 values don't work */
3,6,
0xc,0x14,
0x30,0x60,
0xb8,0x110,
0x240,0x500,
0xca0,0x1b00,
0x3500,0x6000,
0xb400,0x12000,
0x20400,0x72000,
0x90000,0x140000,
0x300000,0x420000,
0xd80000,0x1200000,
0x3880000,0x7200000,
0x9000000,0x14000000,
0x32800000,0x48000000,
0xa3000000 /* for 32 bits wide */
};
/*---------------------------------------------------------------------------
* dissolve() -- dissolve one bitmap into another
* this only works for full width bit maps
*-------------------------------------------------------------------------*/
dissolve( src, dst, speed, transition )
struct BitMap *src,*dst;
LONG speed;
SHORT transition;
{
void fadecolors ();
extern UBYTE svcmap[];
extern SHORT rmap_index;
extern struct ViewPort *vp;
extern struct picture pic;
register UBYTE *mplane; /* the dissolve mask plane */
register long psize; /* the size of a plane */
register long nbits; /* # of bits in a plane */
register int done;
register int i;
register int j;
int c;
int k;
int n_bits_set;
UBYTE *bpt;
psize = src->BytesPerRow * src->Rows;
if( (mplane = (UBYTE *) AllocMem( psize, MEMF_CHIP | MEMF_CLEAR) ) == 0 )
return (STS_BAD_ALLOC);
bpt = mplane;
switch (transition)
{
case DM_ZAP:
default:
bpt = mplane;
for ( i = psize; i--; )
*bpt++ = 0xFF;
setcolors (vp, &pic.cmap[0], pic.numcolors);
BlitBitMapMask (src, dst, mplane);
break;
case DM_TWIPE:
bpt = mplane;
n_bits_set = 0;
for ( i = psize; i--; )
{
*bpt++ = 0xFF;
if ( n_bits_set++ >= speed / 8 )
{
n_bits_set = 0;
fadecolors (vp, &svcmap[0], &pic.cmap[0],
psize + 1 - i, psize, pic.numcolors);
BlitBitMapMask (src, dst, mplane);
}
}
setcolors (vp, &pic.cmap[0], pic.numcolors);
BlitBitMapMask (src, dst, mplane);
break;
case DM_BWIPE:
bpt = mplane + psize - 1;
n_bits_set = 0;
for ( i = psize; i--; )
{
*bpt-- = 0xFF;
if ( n_bits_set++ >= speed / 8 )
{
n_bits_set = 0;
fadecolors (vp, &svcmap[0], &pic.cmap[0],
psize + 1 - i, psize, pic.numcolors);
BlitBitMapMask (src, dst, mplane);
}
}
setcolors (vp, &pic.cmap[0], pic.numcolors);
BlitBitMapMask (src, dst, mplane);
break;
case DM_LWIPE:
n_bits_set = 0;
for ( i=0; i<src->BytesPerRow; i++ )
{
for (k = 0, c = 0x80; k++ < 8; c = 0x80 | ( c >> 1 ) )
{
bpt = mplane + i;
for ( j=0; j<src->Rows; j++)
{
*bpt = (UBYTE) c;
bpt += src->BytesPerRow;
n_bits_set++;
}
if (n_bits_set >= speed)
{
fadecolors (vp, &svcmap[0], &pic.cmap[0],
i+1, src->BytesPerRow, pic.numcolors);
BlitBitMapMask (src, dst, mplane);
n_bits_set = 0;
}
}
}
setcolors (vp, &pic.cmap[0], pic.numcolors);
BlitBitMapMask (src, dst, mplane);
break;
case DM_RWIPE:
n_bits_set = 0;
for ( i=0; i<src->BytesPerRow; i++ )
{
for (c = 1; c < 0x100; c = 1 | ( c << 1 ) )
{
bpt = mplane + psize - i;
for ( j=0; j<src->Rows; j++)
{
*bpt = (UBYTE) c;
bpt -= src->BytesPerRow;
n_bits_set++;
}
if (n_bits_set >= speed)
{
fadecolors (vp, &svcmap[0], &pic.cmap[0],
i+1, src->BytesPerRow, pic.numcolors);
BlitBitMapMask (src, dst, mplane);
n_bits_set = 0;
}
}
}
setcolors (vp, &pic.cmap[0], pic.numcolors);
BlitBitMapMask (src, dst, mplane);
break;
case DM_VBLIN:
n_bits_set = 0;
for (k = 0, c = 0x80; k++ < 8; c = 0x80 | ( c >> 1 ) )
{
fadecolors (vp, &svcmap[0], &pic.cmap[0],
k, 8, pic.numcolors);
for ( i=0; i<src->BytesPerRow; i++ )
{
bpt = mplane + i;
for ( j=0; j<src->Rows; j++)
{
*bpt = (UBYTE) c;
bpt += src->BytesPerRow;
n_bits_set++;
}
if ( n_bits_set >= speed )
BlitBitMapMask (src, dst, mplane);
}
}
setcolors (vp, &pic.cmap[0], pic.numcolors);
BlitBitMapMask (src, dst, mplane);
break;
case DM_DISSO:
nbits = psize << 3;
nbits--; /* max bit is 1 less */
/* initialize the random number generator */
rand_val = 1;
rand_mask = rand_tbl[ rmap_index /* bitwidth(nbits) */ ];
mplane[0] |= 1; /* set the first bit in the mask plane */
done = 0; /* clear done flag */
i = 0;
while( done == 0 )
{
done = setbits( mplane, nbits, speed );
i += speed / 8;
fadecolors (vp, &svcmap[0], &pic.cmap[0],
i, psize,
pic.numcolors);
BlitBitMapMask( src, dst, mplane );
}
}
FreeMem( mplane, psize );
return (STS_OK);
}